package cultivameCore.planta;

import java.util.Calendar;

import cultivameCore.motor.PlantaMedible;
import cultivameCore.tienda.Contable;

public abstract class Planta implements Contable,PlantaMedible{
	//TODOS LOS DATOS SE EXPRESARAN EN mg o ml(Agua)
	private float ca=0;
	private float mg=0;
	private float s=0;
	private float n=0;
	private float p=0;
	private float k=0;
	private float mn=0;
	private float fe=0;
	private float b=0;
	private float cl=0;
	private float co=0;
	private float cu=0;
	private float zn=0;
	private float mo=0;
	
	private float agua=0;
	
	private Calendar f_nacimiento;
	
    Fase fase=new Fase(Fase.FASE_ENRAIZAMIENTO);

	private float tiempo_en_fase=0;
	
	public Planta(){
		f_nacimiento=Calendar.getInstance();
	}

	public float getCa() {
		return ca;
	}

	public void setCa(float ca) {
		this.ca = ca;
	}

	public float getP() {
		return p;
	}

	public void setP(float p) {
		this.p = p;
	}

	public float getK() {
		return k;
	}

	public void setK(float k) {
		this.k = k;
	}

	public float getMn() {
		return mn;
	}

	public void setMn(float mn) {
		this.mn = mn;
	}

	public float getAgua() {
		return agua;
	}

	public void setAgua(float agua) {
		this.agua = agua;
	};

	public float getMg() {
		return mg;
	}

	public void setMg(float mg) {
		this.mg = mg;
	}

	public float getS() {
		return s;
	}

	public void setS(float s) {
		this.s = s;
	}

	public float getN() {
		return n;
	}

	public void setN(float n) {
		this.n = n;
	}

	public float getFe() {
		return fe;
	}

	public void setFe(float fe) {
		this.fe = fe;
	}

	public float getB() {
		return b;
	}

	public void setB(float b) {
		this.b = b;
	}

	public float getCl() {
		return cl;
	}

	public void setCl(float cl) {
		this.cl = cl;
	}

	public float getCo() {
		return co;
	}

	public void setCo(float co) {
		this.co = co;
	}

	public float getCu() {
		return cu;
	}

	public void setCu(float cu) {
		this.cu = cu;
	}
	
	public float getZn() {
		return zn;
	}

	public void setZn(float zn) {
		this.zn = zn;
	}

	public float getMo() {
		return mo;
	}

	public void setMo(float mo) {
		this.mo = mo;
	}

	public Calendar getFNacimiento() {
		return f_nacimiento;
	}
	
	public float getTiempo_en_fase() {
		return tiempo_en_fase;
	}

	public void setTiempo_en_fase(float tiempo_en_fase) {
		this.tiempo_en_fase = tiempo_en_fase;
	}

	public  Fase getFase(){
		return fase;
	}

	public boolean muerta(){
		boolean muerta= ca==0&&
				mg==0&&
				s==0&&
				n==0&&
				p==0&&
				k==0&&
				mn==0&&
				fe==0&&
				b==0&&
				cl==0&&
				co==0&&
				cu==0&&
				mo==0&&
				zn==0&&
				agua==0;
		if(muerta){
			fase=new Fase(Fase.FASE_MUERTA);
		}
		return muerta;
	}

	public abstract void vivir();
	
	public boolean puedeEvolucionar(){
		switch (fase.getFase()){
		case Fase.FASE_ENRAIZAMIENTO:
			return puedeVegetativa1();
		case Fase.FASE_VEGETATIVA1:
			return puedeVegetativa2();
		case Fase.FASE_VEGETATIVA2:
			return puedeGenerativa1();
		case Fase.FASE_GENERATIVO1:
			return puedeGenerativa2();
		case Fase.FASE_GENERATIVO2:
			return puedeGenerativa3();
		case Fase.FASE_GENERATIVO3:
			return puedeGenerativa4();
		case Fase.FASE_GENERATIVO4:
			return puedeMorir();
		default:
			return false;
		}
	}
	
	public abstract boolean puedeMorir();

	public abstract boolean puedeGenerativa4();

	public abstract boolean puedeGenerativa3();

	public abstract boolean puedeGenerativa1();

	public abstract boolean puedeGenerativa2();

	public abstract boolean puedeVegetativa2();

	public abstract boolean puedeVegetativa1();

	public void evolucionar(){
		switch (fase.getFase()){
		case Fase.FASE_ENRAIZAMIENTO:
			fase=new Fase(Fase.FASE_VEGETATIVA1);
			tiempo_en_fase=0;
			evolucionarVeg1();
			break;
		case Fase.FASE_VEGETATIVA1:
			fase=new Fase(Fase.FASE_VEGETATIVA2);
			tiempo_en_fase=0;
			evolucionarVeg2();
			break;
		case Fase.FASE_VEGETATIVA2:
			fase=new Fase(Fase.FASE_GENERATIVO1);
			tiempo_en_fase=0;
			evolucionarGen1();
			break;
		case Fase.FASE_GENERATIVO1:
			fase=new Fase(Fase.FASE_GENERATIVO2);
			tiempo_en_fase=0;
			evolucionarGen2();
			break;
		case Fase.FASE_GENERATIVO2:
			fase=new Fase(Fase.FASE_GENERATIVO3);
			tiempo_en_fase=0;
			evolucionarGen3();
			break;
		case Fase.FASE_GENERATIVO3:
			fase=new Fase(Fase.FASE_GENERATIVO4);
			tiempo_en_fase=0;
			evolucionarGen4();
			break;
		case Fase.FASE_GENERATIVO4:
			fase=new Fase(Fase.FASE_MUERTA);
			tiempo_en_fase=0;
			morir();
			break;
		default:
			
		}
	}

	public abstract void morir();

	public abstract void evolucionarGen4();

	public abstract void evolucionarGen3();

	public abstract void evolucionarGen2();

	public abstract void evolucionarGen1();

	public abstract void evolucionarVeg2();

	public abstract void evolucionarVeg1();

	public String toString(){
		float tiempoVida=Calendar.getInstance().getTime().getTime()-f_nacimiento.getTime().getTime();
		Calendar t = Calendar.getInstance();
		t.getTime().setTime((long) tiempoVida);
		return "";
//		return "********************************************************************\n"+
//		  "** PLANTA                                                         **\n"+
//		  "** Tiempo de Vida: "+(Integer.valueOf(t.get(Calendar.HOUR))-1)+":"+t.get(Calendar.MINUTE)+":"+t.get(Calendar.SECOND)+"   "+(Integer.valueOf(t.get(Calendar.DAY_OF_MONTH))-1)+"/"+t.get(Calendar.MONTH)+"/"+(Integer.valueOf(t.get(Calendar.YEAR))-1970)+"                                  **\n"+
//	      "** fecha nacimiento: "+f_nacimiento.get(Calendar.DAY_OF_MONTH)+"/"+f_nacimiento.get(Calendar.MONTH)+"/"+f_nacimiento.get(Calendar.YEAR)+"                                    **\n"+
//	      "** ca: "+format.format(ca)+", mg: "+format.format(mg)+", s: "+format.format(s)+", n: "+format.format(n)+", p: "+format.format(p)+", k: "+format.format(k)+"                 **\n"+
//	      "** mn: "+format.format(mn)+", fe: "+format.format(fe)+", b: "+format.format(b)+", cl: "+format.format(cl)+", co: "+format.format(co)+", cu: "+format.format(cu)+"                        **\n"+
//	      "** zn: "+format.format(zn)+", mo: "+format.format(mo)+", agua:"+format.format(agua)+"                                          **\n"+
//	      "** fase: "+fase+" tiempo en fase: "+format.format(tiempo_en_fase)+"dia                                **\n"+
//	      "********************************************************************\n";
	}
	public String getInstance() {
		// TODO Auto-generated method stub
		return this.getClass().getName();
	}
}
